#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/wait.h>


int main()
{
    printf("程序开始\n");
    if(fork() == 0)
    {
        sleep(1);
        char* const argv[] = {
            (char* const)"other",
            NULL
        };

        char* const addNewEnv[] = {
            (char* const)"MYENV1=11111111",
            (char* const)"MYENV2=22222222",
            (char* const)"MYENV3=33333333",
            NULL
        };

        for(int i=0; addNewEnv[i]; i++)
        {
            putenv(addNewEnv[i]);
        }

        extern char** environ;

        execvpe("./other", argv, environ);

        exit(22);
    }

    int status = 0;
    waitpid(-1, &status, 0);

    printf("程序结束\n");
    return 0;
}




//int main()
//{
//    printf("进程开始执行，pid:%d, ppid:%d\n", getpid(), getppid());
//    execl("/usr/bin/ls", "ls", "-a", "-l");
//    printf("进程结束，pid:%d, ppid:%d\n", getpid(),getppid());
//    return 0;





//int main()
//{
//    printf("程序开始\n");
//    if(fork() == 0)
//    {
//        sleep(1);
//        char* const argv[] = {
//            (char* const)"ls",
//            (char* const)"-l",
//            (char* const)"-a",
//            NULL
//        };
//        execv("/usr/bin/ls", argv);
//        exit(22);
//    }
//    int status = 0;
//    waitpid(-1, &status, 0);
//    printf("%d\n", WEXITSTATUS(status));
//    printf("程序结束\n");
//    return 0;
//}




//int main()
//{
//    printf("进程开始执行，pid:%d, ppid:%d\n", getpid(), getppid());
//    execl("/usr/bin/ls", "ls", "-a", "-l");
//    printf("进程结束，pid:%d, ppid:%d\n", getpid(),getppid());
//    return 0;



//int main()
//{
//    printf("程序开始\n");
//    if(fork() == 0)
//    {
//        sleep(1);
//        //execlp("ls", "ls", "-l", NULL); 
//        execlp("other", "other", NULL);
//        exit(22);
//    }
//    int status = 0;
//    waitpid(-1, &status, 0);
//    printf("%d\n", WEXITSTATUS(status));
//    printf("程序结束\n");
//    return 0;
//}




//int main()
//{
//    printf("进程开始执行，pid:%d, ppid:%d\n", getpid(), getppid());
//    execl("/usr/bin/ls", "ls", "-a", "-l");
//    printf("进程结束，pid:%d, ppid:%d\n", getpid(),getppid());
//    return 0;
//}



//int main()
//{
//    pid_t id = fork();
//    if(id == 0)
//    {
//        // child
//        while(1)
//        {
//            printf("child pid:%d, ppid:%d\n", getpid(), getppid());
//            sleep(1);
//        }
//        exit(66);
//    }
//
//    // father
//    while(1)
//    {
//        int status = 0;
//        pid_t rid = waitpid(id, &status, WNOHANG);
//
//        if(rid>0) // 等待成功
//        {
//            if(WIFEXITED(status)) // 正常退出
//            {
//                printf("terminated normally exit_code:%d\n", WEXITSTATUS(status));
//            }
//            else// 异常退出
//            {
//                printf("terminated by signal exit_signal:%d\n", WTERMSIG(status));
//            }
//            break;
//        }
//        else if(rid == 0)
//        {
//            // 询问结束，子进程未退出，执行自己的逻辑
//            // ......
//            printf("非阻塞轮询执行逻辑......\n");
//        }
//        else
//        {
//            printf("等待失败\n");
//            break;
//        }
//    }
//    return 0;
//}


//int main()
//{
//    pid_t id = fork();
//    if(id == 0)
//    {
//        // dhild
//        int cnt = 5;
//        while(cnt)
//        {
//
//            printf("child pid:%d, ppid:%d\n", getpid(), getppid());
//            sleep(1);
//            cnt--;
//        }
//        exit(1);
//    }
//
//    // father
//    sleep(10);
//    pid_t wid = wait(NULL);
//    if(wid > 0)
//    {
//        printf("success %d\n",wid);
//    }
//    else
//    {
//        printf("failed\n");
//    }
//    sleep(10);
//    
//    return 0;
//}

//int main()
//{
//    FILE* fp = fopen("log.txt", "r");
//    //exit(-1);
//
//    //printf("%d -> %s\n", errno, strerror(errno));
//    _exit(22);
//
//    return 12;
//}


//int main()
//{
//    for(int i=0; i<135; i++)
//    {
//        printf("%d -> %s\n", i, strerror(i));
//    }
//    return 0;
//}

    
//int main()
//{
//    pid_t id = fork();
//    if(id == 0)
//    {
//        printf("child id = %d\n",id);
//    }
//    else if(id > 0)
//    {
//        printf("father id = %d\n",id);
//    }
//    else
//    {
//        perror("fork");
//        exit(-1);
//    }
//    return 0;
//}
